//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package gui;

import core.ConfigNovaTabul;
import java.text.DecimalFormat;
import javax.swing.JFormattedTextField;
import javax.swing.table.DefaultTableModel;

public class DialogAdicionaPreco extends javax.swing.JDialog {

    /**
     * PanelNovaTabulacao que criou esse dialog.
     */
    PanelNovaTabulacao panelPai;

    /**
     * Modelo da tabela de preços do PanelNovaTabulacao que criou esse dialog.
     */
    DefaultTableModel modeloTblPrecos;

    /**
     * Número do preço que se está se inserindo no momento
     */
    int numAtualPreco;

    /**
     * Configuração da tabulação atual.
     */
    ConfigNovaTabul configAtual;

    /**
     * Constante que indica erro de conversão do preço inserido pelo usuário.
     */
    private static final int erroConverPreco = -1;

    /**
     * Construtor que vincula esse dialog a panel do tipo PanelNovaTabulacao.
     * @param parent
     * @param modal
     * @param panelPai PanelNovaTabulacao que criou este dialog.
     */
    public DialogAdicionaPreco(java.awt.Frame parent, boolean modal, PanelNovaTabulacao panelPai)
    {
        super(parent, modal);
        initComponents();

        this.panelPai = panelPai;
        this.modeloTblPrecos = (DefaultTableModel)this.panelPai.getTblPrecosColetados().getModel();
        this.numAtualPreco = this.modeloTblPrecos.getRowCount() + 1;
        this.configAtual = this.panelPai.getTabulacao().getConfigNovaTabul();

        this.determinarPrecoAtual();

        this.lblProduto.setText("Produto: " + this.configAtual.getNomeProd());
        String textoQtdeCaixa = new DecimalFormat("##.##").format(this.configAtual.getQtdeCaixa());
        this.lblTipoCaixa.setText("Tipo de caixa: " + textoQtdeCaixa + " " +
                this.configAtual.getMetricaCaixa());
        this.ftxtPreco.setFocusLostBehavior(JFormattedTextField.PERSIST);
        this.lblStatusPreco.setVisible(false);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblTitulo = new javax.swing.JLabel();
        lblProduto = new javax.swing.JLabel();
        lblTipoCaixa = new javax.swing.JLabel();
        lblInserirPreco = new javax.swing.JLabel();
        lblStatusPreco = new javax.swing.JLabel();
        btnAdicionarPreco = new javax.swing.JButton();
        btnVoltarATabulacao = new javax.swing.JButton();
        ftxtPreco = new javax.swing.JFormattedTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Adicionar Novo Preço");
        setResizable(false);

        lblTitulo.setFont(new java.awt.Font("Tahoma", 1, 16));
        lblTitulo.setText("Preço");

        lblProduto.setText("Produto:");

        lblTipoCaixa.setText("Tipo de caixa:");

        lblInserirPreco.setFont(new java.awt.Font("Tahoma", 2, 11));
        lblInserirPreco.setText("Abaixo, digite o preço da caixa em reais (R$). Exemplo: 09.50");

        lblStatusPreco.setForeground(new java.awt.Color(204, 0, 51));
        lblStatusPreco.setText("Mensagem caso haja algum problema com o valor digitado");

        btnAdicionarPreco.setText("Adicionar preço");
        btnAdicionarPreco.setToolTipText("Adiciona o preço digitado à tabela de preços");
        btnAdicionarPreco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarPrecoActionPerformed(evt);
            }
        });

        btnVoltarATabulacao.setText("Voltar à tabulação");
        btnVoltarATabulacao.setToolTipText("Fecha esta janela e retorna à tabela de preços");
        btnVoltarATabulacao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVoltarATabulacaoActionPerformed(evt);
            }
        });

        try {
            ftxtPreco.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##,##")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        ftxtPreco.setMaximumSize(new java.awt.Dimension(67, 20));
        ftxtPreco.setMinimumSize(new java.awt.Dimension(67, 20));
        ftxtPreco.setPreferredSize(new java.awt.Dimension(67, 20));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(lblInserirPreco, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblTitulo, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblProduto, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblTipoCaixa, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(ftxtPreco, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblStatusPreco))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(btnAdicionarPreco)
                        .addGap(18, 18, 18)
                        .addComponent(btnVoltarATabulacao)))
                .addContainerGap(57, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblTitulo)
                .addGap(18, 18, 18)
                .addComponent(lblProduto)
                .addGap(18, 18, 18)
                .addComponent(lblTipoCaixa)
                .addGap(18, 18, 18)
                .addComponent(lblInserirPreco)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ftxtPreco, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblStatusPreco))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAdicionarPreco)
                    .addComponent(btnVoltarATabulacao))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        getAccessibleContext().setAccessibleParent(null);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnAdicionarPrecoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAdicionarPrecoActionPerformed

        float precoCaixa = this.validarPrecoDigitado();

        if (precoCaixa == DialogAdicionaPreco.erroConverPreco)
        {
            // o preço digitado não é valido; ele não é adicionado à tabela de preços e informamos o erro ao usuário
            this.lblStatusPreco.setText("Valor inválido; siga o formato do exemplo acima.");
            this.lblStatusPreco.setVisible(true);
            this.ftxtPreco.setText("");
        }
        else
        {
            // adição da nova linha à tabela de preços coletados

            float precoUnitario = precoCaixa / this.configAtual.getQtdeCaixa();
            String nomePrecoAtual = "Preço " + this.numAtualPreco;

            DecimalFormat decimalFormat = new DecimalFormat("00.00");
            String textoPrecoCaixa = decimalFormat.format(precoCaixa);
            String textoPrecoUni = decimalFormat.format(precoUnitario);

            Object[] novaLinha = new Object[3];
            novaLinha = new Object[]{nomePrecoAtual, textoPrecoCaixa, textoPrecoUni};
            this.modeloTblPrecos.addRow(novaLinha);

            // reiniciando os componentes da janela para receber um novo preço
            this.numAtualPreco++;
            determinarPrecoAtual();
            this.ftxtPreco.setText("");
            this.lblStatusPreco.setVisible(false);
        }

        this.ftxtPreco.requestFocusInWindow();
    }//GEN-LAST:event_btnAdicionarPrecoActionPerformed

    private void btnVoltarATabulacaoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVoltarATabulacaoActionPerformed

        panelPai.assumirEstadoPosPreco();
        this.dispose();
    }//GEN-LAST:event_btnVoltarATabulacaoActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAdicionarPreco;
    private javax.swing.JButton btnVoltarATabulacao;
    private javax.swing.JFormattedTextField ftxtPreco;
    private javax.swing.JLabel lblInserirPreco;
    private javax.swing.JLabel lblProduto;
    private javax.swing.JLabel lblStatusPreco;
    private javax.swing.JLabel lblTipoCaixa;
    private javax.swing.JLabel lblTitulo;
    // End of variables declaration//GEN-END:variables

    /**
     * Gera o título adequado para a janela, de acordo com a quantidade
     * de preços que já foi adicionada.
     */
    private void determinarPrecoAtual()
    {
        this.lblTitulo.setText("Preço " + this.numAtualPreco);
    }

    /**
     * Verifica se o preço digitado é valido.
     * @return Preço digitado já convertido, ou DialogAdicionaPreco.erroConverPreco caso o preço seja inválido
     */
    private float validarPrecoDigitado()
    {
        String precoDigitado = ftxtPreco.getText().trim().replace(',', '.');
        float precoConvertido;

        // verificamos se a caixa foi totalmente preenchida
        if (precoDigitado.length() == 5)
        {
            try
            {
                precoConvertido = Float.parseFloat(precoDigitado);

                // se o preço for menor do que zero, não podemos o aceitar
                if (precoConvertido <= 0)
                {
                    throw new Exception();
                }

            } catch (Exception e)
            {
                // houve uma exceção na conversão; não podemos aceitar o preço digitado
                precoConvertido = DialogAdicionaPreco.erroConverPreco;
            }
        }
        else
        {
            // usuário não inseriu o preço no formato pedido; não podemos aceitar o preço digitado
            precoConvertido = DialogAdicionaPreco.erroConverPreco;
        }

        return precoConvertido;
    }
}
